package org.wzh.spring.di.demol;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@ComponentScan
public class Config {

	/**
	 * 条件化创建bean. Spring4引入了@Conditional注解,它可以用到带有@Bean注解的方法上.
	 * 如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略.
	 * 
	 * @Conditional 注解会通过Condition接口进行条件对比.
	 * @return
	 */
	@Bean
	@Conditional(MagicExistsCondition.class)
	public MagicBean magicBean() {
		return new MagicBean();
	}

	/**
	 * 从Spring4开始,@Profile注解进行了重构,使其基于@Conditional和Condition实现.
	 * @Retention(RetentionPolicy.RUNTIME)
	 * @Target({ElementType.TYPE, ElementType.METHOD})
	 * @Documented
	 * @Conditional(ProfileCondition.class)
	 * public @interface Profile {
	 * 		String[] value();
	 * }
	 * @Profile 本身也使用了@Conditional 注解,并且引用ProfileCondition作为Condition实现.
	 * ProfileCondition实现Condition接口,并且在做出决策的过程中,考虑到了ConditionContext和
	 * AnnotatedTypeMetadata中的多个因素.
	 * 
	 * ProfileCondition通过AnnotatedTypeMetadata得到了用于@Profile注解的所有属性.借助该信息,它会明确的
	 * 检查value属性,该属性包含了bean的profile名称.然后,它根据ConditionContext得到的Environment来检查该
	 * profile是否处于激活状态[根据acceptsProfiles()方法]
	 * */

}
